export const input = {
  id: 'http://json-schema.org/draft-04/schema#',
  $schema: 'http://json-schema.org/draft-04/schema#',
  description: 'Core schema meta-schema',
  definitions: {
    schemaArray: {
      type: 'array',
      minItems: 1,
      items: {$ref: '#'},
    },
    positiveInteger: {
      type: 'integer',
      minimum: 0,
    },
    positiveIntegerDefault0: {
      allOf: [{$ref: '#/definitions/positiveInteger'}, {default: 0}],
    },
    simpleTypes: {
      enum: ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'],
    },
    stringArray: {
      type: 'array',
      items: {type: 'string'},
      minItems: 1,
      uniqueItems: true,
    },
  },
  type: 'object',
  properties: {
    id: {
      type: 'string',
      format: 'uri',
    },
    $schema: {
      type: 'string',
      format: 'uri',
    },
    title: {
      type: 'string',
    },
    description: {
      type: 'string',
    },
    default: {},
    multipleOf: {
      type: 'number',
      minimum: 0,
      exclusiveMinimum: true,
    },
    maximum: {
      type: 'number',
    },
    exclusiveMaximum: {
      type: 'boolean',
      default: false,
    },
    minimum: {
      type: 'number',
    },
    exclusiveMinimum: {
      type: 'boolean',
      default: false,
    },
    maxLength: {$ref: '#/definitions/positiveInteger'},
    minLength: {$ref: '#/definitions/positiveIntegerDefault0'},
    pattern: {
      type: 'string',
      format: 'regex',
    },
    additionalItems: {
      anyOf: [{type: 'boolean'}, {$ref: '#'}],
      default: {},
    },
    items: {
      anyOf: [{$ref: '#'}, {$ref: '#/definitions/schemaArray'}],
      default: {},
    },
    maxItems: {$ref: '#/definitions/positiveInteger'},
    minItems: {$ref: '#/definitions/positiveIntegerDefault0'},
    uniqueItems: {
      type: 'boolean',
      default: false,
    },
    maxProperties: {$ref: '#/definitions/positiveInteger'},
    minProperties: {$ref: '#/definitions/positiveIntegerDefault0'},
    required: {$ref: '#/definitions/stringArray'},
    additionalProperties: {
      anyOf: [{type: 'boolean'}, {$ref: '#'}],
      default: {},
    },
    definitions: {
      type: 'object',
      additionalProperties: {$ref: '#'},
      default: {},
    },
    properties: {
      type: 'object',
      additionalProperties: {$ref: '#'},
      default: {},
    },
    patternProperties: {
      type: 'object',
      additionalProperties: {$ref: '#'},
      default: {},
    },
    dependencies: {
      type: 'object',
      additionalProperties: {
        anyOf: [{$ref: '#'}, {$ref: '#/definitions/stringArray'}],
      },
    },
    enum: {
      type: 'array',
      minItems: 1,
      uniqueItems: true,
    },
    type: {
      anyOf: [
        {$ref: '#/definitions/simpleTypes'},
        {
          type: 'array',
          items: {$ref: '#/definitions/simpleTypes'},
          minItems: 1,
          uniqueItems: true,
        },
      ],
    },
    allOf: {$ref: '#/definitions/schemaArray'},
    anyOf: {$ref: '#/definitions/schemaArray'},
    oneOf: {$ref: '#/definitions/schemaArray'},
    not: {$ref: '#'},
  },
  dependencies: {
    exclusiveMaximum: ['maximum'],
    exclusiveMinimum: ['minimum'],
  },
  default: {},
}
